package hu.arguscab.game;

import hu.arguscab.ai.Operation;

/**
 * Immutable class.
 * @param <A> milyen action-öket lehet az adott State-n végrehajtani.
 * @author sharp
 */
public interface State {

	/**
	 * Az aktuális állapotával tér vissza
	 * @return
	 */
	State getCurrentState();

	/**
	 * A "tick" idő mulva felvett állapotával tér vissza
	 * @param tick
	 * @return
	 */
	State getState(int tick);

	/**
	 * Létrehoz egy új állapotot, amely új állapotban az "action" esemény
	 * hajtódik végre. Az esemény következménye csak a következő tickekben
	 * lesz érezhető!
	 * @param actions
	 * @return
	 */
	State getByActions(CompoundAction actions);

	/**
	 * Létrehoz egy új állapotot, amely új állapotban az "action" esemény
	 * hajtódik végre "tick" alkalomszor
	 * @param actions
	 * @param tick 
	 * @return
	 */
	State getByActions(CompoundAction actions, int tick);

	void applyAction(CompoundAction actions);
	void update();
	void update(int tick);
}
